昨天的範例將資料序列與非同步作業結合,但Rx可以結合事件驅動,我想要把準備好的名單換掉,改成由Console視窗決定資料來源,首先要準備好Observalbe來觀察輸入資料
var input = Observable.Create<string>(o =>
{
Input(Console.ReadLine()!);
return Disposable.Empty;
void Input(string s)
{
if (s == "q") o.OnCompleted();
else
{
o.OnNext(s);
Test(Console.ReadLine()!);
}
}
});
在這邊設計了Input方法,如果輸入值s不為”q”的話就會將s作為後續觀察物件OnNext方法的輸入值,並且遞迴呼叫,這樣就設計好資料來源了,接下來就是結合非同步查詢的部份
(from a in ar
from s in GetRoleAsync(a)
select s).Subscribe(Console.WriteLine);
// input : "洛伊得"
// output: "黃昏"
// input : "約兒"
// output: "睡美人"
為了更好掌握Reactive的特性,我們來比較一下昨天名單與今天輸入值的差別
改成由Console視窗輸入查詢值的樣子,是不是比較能體會到Reactive響應式的特性呢?針對每次資料來源的輸入就可以個別查詢結果。將需要觀察資料源製作成可觀察的物件,利用monad可組合的特性,就能夠想像將各種操作組合成單一的Observerable物件並訂閱事件!
今天介紹了針對不固定的數據來源進行訂閱。明天要介紹如何觀察兩個數據來源的情況,透過Rx.net可以將兩個需要被觀察的事件流和二為一!